/**
 * 改变 this 指向, 并且调用
 * @param fn 函数
 * @param obj 对象
 * @param args 调用参数
 */
function call(fn, obj, ...args) {
//    将函数挂到对象上
    obj.tempFn = fn;
//    调用函数
    const result = obj.tempFn(...args)
//    清除属性
    delete obj.tempFn
//    返回结果
    return result;
}

/**
 * 改变 this 指向, 并且调用
 * @param fn 函数
 * @param obj 对象
 * @param args 调用参数 []
 */
function apply(fn, obj, args) {
    obj.tempFn = fn;
    const result = obj.tempFn(...args)
    delete obj.tempFn
    return result;
}

/**
 * 改变 this 指向, 返回新指向的函数
 * @param fn 函数
 * @param obj 对象
 * @param args 调用参数
 */
function bind(fn, obj, ...args) {
    return function (...arg2) {
       return call(fn, obj, ...args, ...arg2)
    }
}